Python小技巧!如何简化大量的 if…elif…else 代码?

您所在的位置:网站首页 符合条件 英文缩写 Python小技巧!如何简化大量的 if…elif…else 代码?

Python小技巧!如何简化大量的 if…elif…else 代码?

2023-09-18 12:14| 来源: 网络整理| 查看: 265

5b0d1b9923c58353a1f66607087c5b62.png

花下猫语:在日常代码中,我们总是会面对大量 if...elif...else 条件分支选择的问题。说实话,我在多数情况下首推就是老老实实地写 if...elif,并且设法把每个分支下的内容抽取成独立的函数。结构清晰,意图明白,对于编写和阅读都是极大的便利。不过,在某些特殊的情况下,还可以使用其它更为优雅的写法,比如我们之前分享过的《不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?》,以及今天要分享的这篇文章,可以开阔一下代码编写思路。

今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。

正好今天是双十一,假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if ... elif...写法是这样的:

def get_discount(level):     if level == 1:         "大量计算代码"         discount = 0.1     elif level == 2:         "大量计算代码"         discount = 0.2     elif level == 3:         discount = 0.3     elif level == 4:         discount = 0.4     elif level == 5:         discount = 0.5     elif level == 6:         discount = 3 + 2 - 5 * 0.1     else:          return '等级错误'     return discount

大家都知道,这样大量的if ... elif...代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。

有一些同学知道,可以使用字典来改写这个太长的 if 判断:

def parse_level_1():     "大量计算代码"     discount = 0.1     return discount def parse_level_2():     "大量计算代码"     discount = 0.2     return discount def parse_level_3():     "大量计算代码"     discount = 0.3     return discount def parse_level_4():     "大量计算代码"     discount = 0.4     return discount def parse_level_5():     "大量计算代码"     discount = 0.5     return discount def parse_level_6():     "大量计算代码"     discount = 3 + 2 - 5 * 0.1     return discount discount_map = {  1: parse_level_1,   2: parse_level_2,   3: parse_level_3,   4: parse_level_4,   5: parse_level_5,   6: parse_level_6, } discount = discount_map.get(level, '等级错误')

但今天我学到的这个方法,比用字典更简单。我们先来看它的效果:

@value_dispatch def get_discount(level):     return '等级错误' @get_discount.register(1) def parse_level_1(level):     "大量计算代码"     discount = 0.1     return discount @get_discount.register(2) def parse_level_2(level):     "大量计算代码"     discount = 0.2     return discount @get_discount.register(3) def parse_level_3(level):     "大量计算代码"     discount = 0.3     return discount @get_discount.register(4) def parse_level_4(level):     "大量计算代码"     discount = 0.4     return discount @get_discount.register(5) def parse_level_5(level):     "大量计算代码"     discount = 0.5     return discount @get_discount.register(6) def parse_level_1(level):     "大量计算代码"     discount = 3 + 2 - 5 * 0.1     return discount discount = get_discount(3) print(f'等级3的用户,获得的折扣是:{discount}')

运行效果如下图所示:

f67b435276e480942e374d336d6b21f5.png

这样写,比用字典的方式更直观,比直接用if ... elif...更简洁。

那么,这个装饰器value_dispatch是怎么实现的呢?密码就藏在这个开源项目EdgeDB的源代码[2]中,核心代码只有20多行:

7904261c2c59a1aa04171bc972c43f6c.png

并且,还能够实现或查询。例如用户等级为2或者3的时候,折扣都是0.2,那么代码可以写成:

@get_discount.register(2) @get_discount.register(3) def parse_level_2(level):     "大量计算代码"     discount = 0.2     return discount

运行效果如下图所示:

de4446f561684b2497e36ae930f76182.png

它这个代码目前只能实现相等的查询。但其实只要对这个代码稍作修改,我们就能实现大于、小于、大于等于、小于等于、不等于、in等等判断。如果大家有兴趣的话,请在文章下面留言,我们明天就来说说怎么对这个代码进行改造,实现更多的逻辑判断。

参考文献

[1] EdgeDB: https://github.com/edgedb/edgedb

[2] 源代码: https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py

推荐阅读: 入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径 干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影 趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏! AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影 小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

1).卧槽!Pdf转Word用Python轻松搞定!

2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 

4).80行代码!用Python做一个哆来A梦分身 

5).你必须掌握的20个python代码,短小精悍,用处无穷 

6).30个Python奇淫技巧集 

7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 

8).再见Python!我要学Go了!2500字深度分析!

9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点阅读原文,看200个Python案例!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3